home *** CD-ROM | disk | FTP | other *** search
/ Merciful 2 / Merciful - Disc 2.iso / software / d / dialupv3.06.lha / dialup / commands.c < prev    next >
C/C++ Source or Header  |  1996-01-30  |  8KB  |  275 lines

  1. #include "dialup.h"
  2.  
  3. extern BPTR            mystderr;
  4. extern const UBYTE         *prgname;
  5. extern struct IOExtSer        *serialIOReq;
  6. extern struct timerequest    *timereq;
  7. extern BPTR            repfile;
  8. extern UBYTE            *rxbuffer;
  9. extern LONG            arg[];
  10. extern struct argspec        argtab[];
  11.  
  12. BOOL
  13. take( UBYTE *varbuf )
  14. {
  15.     UBYTE rgcnt;
  16.  
  17.     if ( *(UBYTE *)arg[A_MSC] )
  18.           VERIFY ( sendEx( (UBYTE *)arg[A_MSC], (UBYTE *)arg[A_MOK], 3 ) ); /* set modem config (usually a RESET) */
  19.     if ( !arg[A_NDI] )
  20.           VERIFY ( sendEx( "AT&D0", (UBYTE *)arg[A_MOK], 2 ) ); /* ignore DTR ? */
  21.  
  22.     /* wait for A_RGS rings without timeout */
  23.     do
  24.         for(rgcnt = 0; rgcnt < *((LONG *)arg[A_RGS]); rgcnt++)
  25.             if ( !expectFromSer( (UBYTE *)arg[A_MRG], *((LONG *)arg[A_RGS]) > 0 && rgcnt == 0 ? 0x7FFFFFFF : 3) )
  26.                 break;
  27.     while ( rgcnt < *((LONG *)arg[A_RGS]) && !strstr(rxbuffer, BREAKSTR) ); /* count again, if timeout (not enough rings) but no user break */
  28.  
  29.     VERIFY ( !strstr(rxbuffer, BREAKSTR) );
  30.     VERIFY ( sendEx( (UBYTE *)arg[A_MOH], (UBYTE *)arg[A_MAC], *(LONG *)arg[A_MCT] ) );    /* take call */
  31.     VERIFY ( checkconnect(varbuf) );
  32.  
  33.     _OK_;
  34. }
  35.  
  36.  
  37. BOOL
  38. connect(UBYTE *varbuf)
  39. {
  40.     UBYTE PNidx = 0;
  41.     UBYTE lastPNidx = 0;
  42.     UBYTE **PNA;
  43.  
  44.     PNA = (UBYTE **)arg[A_PN];
  45.  
  46.     if ( *(UBYTE *)arg[A_MSC] )
  47.             VERIFY ( sendEx( (UBYTE *)arg[A_MSC], (UBYTE *)arg[A_MOK], 3 ) ); /* set modem config (usually a RESET) */
  48.     if ( !arg[A_NDI] )
  49.             VERIFY ( sendEx( "AT&D0", (UBYTE *)arg[A_MOK], 2 ) ); /* ignore DTR ? */
  50.  
  51.     loop    /* redial loop */
  52.     {
  53.         if ( !arg[A_NRC] || arg[A_AA] ) /* reconnect or autoanswer ? */
  54.         {
  55.             sprintf(varbuf, (UBYTE *)arg[A_MAAC], *((LONG *)arg[A_RGS]) );
  56.             VERIFY ( sendEx( varbuf, (UBYTE *)arg[A_MOK], 2 ) );
  57.         };
  58.  
  59.         /* dial or enter local analog loopback: */
  60.         if ( arg[A_TEST] )
  61.                     sprintf(varbuf, "%s",  (UBYTE *)arg[A_MTC]);
  62.         else if ( *PNA[PNidx] == '!' )
  63.                     sprintf(varbuf, "%s",  PNA[PNidx] + 1 );
  64.         else if ( ABBREV( PNA[PNidx], "AT" ) )
  65.                     sprintf(varbuf, "%s",  PNA[PNidx] );
  66.         else
  67.                     sprintf(varbuf, "ATD%s", PNA[PNidx] );
  68.  
  69.         VERIFY ( sendLine( varbuf ) );
  70.         sprintf(varbuf, "%s|%s|%s|%s", arg[A_MLB], arg[A_MNC], arg[A_MAC], arg[A_MLD]);
  71.         VERIFY ( expectFromSer( varbuf, arg[A_TEST] ? 5 : *(LONG *)arg[A_MCT] ) );
  72.  
  73.         if ( ! sStrMatch(rxbuffer, (UBYTE *)arg[A_MLB], varbuf ) )
  74.                    break;    /* Do not redial if anything else than BUSY */
  75.  
  76.         DisplayBeep(NULL);
  77.         /* switch to next number */
  78.         if ( !PNA[++PNidx] )
  79.         {
  80.             PNidx = 0;
  81.             if ( *(LONG *)arg[A_RDD] == 0 ) _FAIL_;    /* no redial of the number(s) at all! */
  82.         };
  83.  
  84.         if ( !arg[A_NRC] || arg[A_AA] ) /* reconnect or autoanswer ? */
  85.         { /* set modem to not auto answer during wait: */
  86.             sprintf(varbuf, (UBYTE *)arg[A_MAAC], 0 );
  87.             VERIFY ( sendEx( varbuf, (UBYTE *)arg[A_MOK], 2 ) );
  88.         };
  89.  
  90.         if ( strcmp(PNA[lastPNidx], PNA[PNidx]) == 0 || PNidx == 0) /* same number or first one again? Then wait a bit. */
  91.                     VERIFY ( expectFromSer( NULL, *(LONG *)arg[A_RDD] ) );
  92.         lastPNidx = PNidx;
  93.         };
  94.  
  95.     /* What did modem say: */
  96.     if ( sStrMatch(rxbuffer, (UBYTE *)arg[A_MLD], varbuf ) )
  97.     {
  98.         msg("Sorry! Modem doesn't get a dialtone.");
  99.         _FAIL_;
  100.     }
  101.     else
  102.             VERIFY ( checkconnect( varbuf ) );
  103. /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  104.         /* If a WBW is defined, do the wait with a dummy Expect */
  105.         if ( arg[A_WBW] && *(LONG *)arg[A_WBW] > 0 )
  106.             expectFromSer( NULL, *(LONG *)arg[A_WBW] );
  107.  
  108.         /* If a WUS is defined, send it */
  109.     if ( arg[A_WUS] && *((UBYTE *)arg[A_WUS]) )
  110.             VERIFY ( sendWUSSer( (UBYTE *)arg[A_WUS] ) );
  111.  
  112.         /* If a LIP is defined, get it */
  113.     if ( arg[A_LIP] && *((UBYTE *)arg[A_LIP]) )
  114.         {
  115.     /* handle login prompt */
  116.         if ( arg[A_TEST] )
  117.             {
  118.         sprintf(varbuf, "\n\n**TEST: %s", arg[A_LIP] == argtab[A_LIP].deflt ? "Login:" : (UBYTE *)arg[A_LIP]);
  119.         VERIFY ( sendToSer( varbuf ) );
  120.         };  /* the "while (!" is mine                             was LTO here */
  121.             VERIFY ( exSend( (UBYTE *)arg[A_LIP], *((LONG *)arg[A_LTO]), (UBYTE *)arg[A_LIN] ) );
  122.             /*    VERIFY ( sendToSer( (UBYTE *)arg[A_WUS] ) ); */
  123.     };
  124.     
  125.     /* handle password prompt */
  126.     if ( arg[A_PWP] && *((UBYTE *)arg[A_PWP]) )
  127.     {
  128.         if ( arg[A_TEST] )
  129.         {
  130.             sprintf(varbuf, "\n\n**TEST: %s", arg[A_PWP] == argtab[A_PWP].deflt ? "Password:" : (UBYTE *)arg[A_PWP]);
  131.             VERIFY ( sendToSer( varbuf) );
  132.         };
  133.         VERIFY ( exSend( (UBYTE *)arg[A_PWP], 10, (UBYTE *)arg[A_PW] ) );
  134.     };
  135.  
  136.     /* handle second login prompt */
  137.     if ( arg[A_SLIN] && *((UBYTE *)arg[A_SLIN]) )
  138.     {
  139.         if ( arg[A_TEST] )
  140.         {
  141.             sprintf(varbuf, "\n\n**TEST: %s", arg[A_SLIP] == argtab[A_SLIP].deflt ? "2. Login:" : (UBYTE *)arg[A_SLIP]);
  142.             VERIFY ( sendToSer( varbuf) );
  143.         };
  144.         VERIFY ( exSend( (UBYTE *)arg[A_SLIP], *((LONG *)arg[A_LTO]), (UBYTE *)arg[A_SLIN] ) );
  145.     };
  146.  
  147.     /* handle snd pw prompt */
  148.     if ( arg[A_SPW] && *((UBYTE *)arg[A_SPW]) )
  149.     {
  150.         if ( arg[A_TEST] )
  151.         {
  152.             sprintf(varbuf, "\n\n**TEST: %s", arg[A_SPWP] == argtab[A_SPWP].deflt ? "2. Password:" : (UBYTE *)arg[A_SPWP]);
  153.             VERIFY ( sendToSer( varbuf) );
  154.         };
  155.         VERIFY ( exSend( (UBYTE *)arg[A_SPWP], 10, (UBYTE *)arg[A_SPW] ) );
  156.     };
  157.  
  158.     /* check remote response for successful login: */
  159.     if ( arg[A_LOK] && *((UBYTE *)arg[A_LOK])  )
  160.     {
  161.         if ( arg[A_TEST] )
  162.         {
  163.             sprintf(varbuf, "\n\n**TEST: %s", (UBYTE *)arg[A_LOK]);
  164.             VERIFY ( sendToSer( varbuf) );
  165.         };
  166.         VERIFY ( expectFromSer( (UBYTE *)arg[A_LOK], *((LONG *)arg[A_LOT]) ) );
  167.  
  168.         if ( repfile ) Write(repfile, WS("\n"));
  169.     };
  170.  
  171.     _OK_;
  172. }
  173.  
  174. BOOL
  175. hangup(UBYTE *varbuf)
  176.     {
  177.     if ( carrier() )
  178.     {
  179.         VERIFY ( commandmode(varbuf) );
  180.         VERIFY ( dropline(varbuf) );
  181.     }
  182.     else
  183.     {
  184.         VERIFY ( sendEx( (UBYTE *)arg[A_MRC], "?*\r", 3) )
  185.         Delay(25);
  186.     }        
  187.  
  188.     if ( arg[A_AA])
  189.     {
  190.         if ( arg[A_MSC] && *(UBYTE *)arg[A_MSC] ) VERIFY ( sendEx( (UBYTE *)arg[A_MSC], (UBYTE *)arg[A_MOK], 3 ) ); /* set modem *connect* config (usually a RESET) */
  191.         sprintf(varbuf, (UBYTE *)arg[A_MAAC], *(LONG *)arg[A_RGS] );    /* modem autoanswer */
  192.         VERIFY ( sendEx( varbuf, (UBYTE *)arg[A_MOK], 2 ) );
  193.         if ( !arg[A_NDI] ) VERIFY ( sendEx( "AT&D0", (UBYTE *)arg[A_MOK], 2 ) ) ;    /* ignore DTR  */
  194.     }
  195.     else
  196.     {
  197.         if ( arg[A_MSC] && *(UBYTE *)arg[A_MSH] ) VERIFY ( sendEx( (UBYTE *)arg[A_MSH], (UBYTE *)arg[A_MOK], 3 ) ); /* set modem hangup config (usually a RESET) */
  198.         if ( !arg[A_NRC] )
  199.         {
  200.             sprintf(varbuf, (UBYTE *)arg[A_MAAC], 0 ); /* set modem to not auto answer: */
  201.             VERIFY ( sendEx( varbuf, (UBYTE *)arg[A_MOK], 2 ) );
  202.         }
  203.         if ( !arg[A_NDI] ) VERIFY ( sendEx( "AT&D2", (UBYTE *)arg[A_MOK], 2 ) ); /* honor DTR again: */
  204.     }
  205.  
  206.     _OK_;
  207. }
  208.  
  209. BOOL
  210. commandmode(UBYTE *varbuf)
  211. {
  212.     BPTR temp = repfile;
  213.  
  214.     Delay(50); /* send +++ : */
  215.     VERIFY ( sendToSer( (UBYTE *)arg[A_MOC] ) );
  216.     sprintf(varbuf, "%s|%s", (UBYTE *)arg[A_MOK], arg[A_MNC]);
  217.     repfile = NULL;
  218.     if ( !expectFromSer( (UBYTE *) varbuf, 3 ) )
  219.     {
  220.         repfile = temp;
  221.         VERIFY ( sendEx( (UBYTE *)arg[A_MRC], (UBYTE *)arg[A_MOK], 2 ) );  /* maybe already offline ? */
  222.     }
  223.     else repfile = temp;
  224.     _OK_;
  225. }
  226.  
  227. BOOL
  228. dropline(UBYTE *varbuf)
  229. {
  230.     if ( !arg[A_TEST] )    /* hangup line (ATH0) */
  231.         VERIFY ( sendEx( (UBYTE *)arg[A_MHC], (UBYTE *)arg[A_MOK], 2 ) )
  232.     else
  233.     {
  234.         sprintf( varbuf, "%s|%s", (UBYTE *)arg[A_MOK], arg[A_MNC]);
  235.         VERIFY ( sendEx( (UBYTE *)arg[A_MTO], varbuf, 2 ) );
  236.     };
  237.  
  238.     _OK_;
  239. }
  240.  
  241.  
  242. BOOL
  243. query(UBYTE *varbuf)
  244. {
  245.     BOOL connected = carrier();
  246.  
  247.     if ( connected )
  248.             VERIFY ( commandmode(varbuf) );
  249.     VERIFY ( sendEx( (UBYTE *)arg[A_MQC], (UBYTE *)arg[A_MOK], 8 ) );
  250.     if ( connected )
  251.             VERIFY ( sendEx( (UBYTE *)arg[A_MLC], (UBYTE *)arg[A_MAC], 2 ) );
  252.  
  253.     _OK_;
  254. }
  255.  
  256.  
  257. BOOL
  258. checkconnect(UBYTE *buf)
  259. {
  260.     UBYTE *anycon;
  261.  
  262.     if ( !(anycon = sStrMatch(rxbuffer, (UBYTE *)arg[A_MAC], buf ) ) )
  263.     {
  264.         msg(rxbuffer);
  265.         _FAIL_;
  266.         }
  267.     else
  268.     {
  269.         if ( arg[A_CS] && !sStrMatch(rxbuffer, (UBYTE *)arg[A_CS], buf) )
  270.             msg("Modem handshake result:\n %s", anycon);
  271.         _OK_;
  272.     };
  273. }
  274.  
  275.